#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include "rand_bm.h"

// retorna o maior numero, a ou b
double max(double a, double b) {
	if(a > b)
		return a;
	return b;
}

// calcula a media aritimetica do vetor trials, que tem M elementos
double fmean(double *trials, int M) {
	double sum = 0;

	int i;
	for(i = 0; i < M; i++) {
		sum += trials[i];
	}	
	return sum/M;
}

// calcula o desvio padrao do vetor trials, dado uma media mean
double fstddev(double *trials, double mean, int M) {
	double aux;
	double sum = 0;

	int i;
	for(i = 0; i < M; i++) {
		aux = trials[i] - mean;
		sum += aux * aux;
	}
	return sqrt(sum/M);
}

int main(int argc, char *argv[]) {
	double S;	// S: valor da ação
	double E;	// E: preço de exercício da opção
	double r;	// r: taxa de juros livre de risco (SELIC)
	double vol;	// σ: volatilidade da ação
	double T;	// T : tempo de validade da opção
	int M;		// M : número de iterações

	// inicializacao das variaveis a partir dos dados de entrada
	scanf("%lf", &S);
	scanf("%lf", &E);
	scanf("%lf", &r);
	scanf("%lf", &vol);
	scanf("%lf", &T);
	scanf("%d", &M);
	
	srand(time(NULL));
	struct BoxMullerState state;
	initBoxMullerState(&state);

	int i;
	double t;
	double trials[M];
	for(i=0; i<M; i++) {
//		t = S * exp( (r - 0.5*(vol*vol)) * T + vol * sqrt(T) * (rand() / (double)((1LL<<31)-1)) );
		t = S * exp( (r - 0.5*(vol*vol)) * T + vol * sqrt(T) * boxMullerRandom(&state) );
		trials[i] = exp(-r * T) * max(t-E, 0);
	}

	double mean = fmean(trials, M);
	double stddev = fstddev(trials, mean, M);
	double confwidth = 1.96 * stddev / sqrt(M);
	double confmin = mean - confwidth;
	double confmax = mean + confwidth;

	// imprime o resultado na saida padrao
	printf("S	%d\n", (int) S);
	printf("E	%d\n", (int) E);
	printf("r	%d\n", (int) r);
	printf("vol	%d\n", (int) vol);
	printf("T	%d\n", (int) T);
	printf("M	%d\n", M);
	printf("Confidence Interval: (%f, %f)\n", confmin, confmax);
	
	return 0;
}

